#ifndef _QEXTSYSTEM_H
#define _QEXTSYSTEM_H

/*
   The operating system, must be one of: (QEXT_OS_x)

     DARWIN   - Any Darwin system (macOS, iOS, watchOS, tvOS)
     MACOS    - macOS
     IOS      - iOS
     WATCHOS  - watchOS
     TVOS     - tvOS
     WIN32    - Win32 (Windows 2000/XP/Vista/7 and Windows Server 2003/2008)
     CYGWIN   - Cygwin
     SOLARIS  - Sun Solaris
     HPUX     - HP-UX
     LINUX    - Linux [has variants]
     FREEBSD  - FreeBSD [has variants]
     NETBSD   - NetBSD
     OPENBSD  - OpenBSD
     INTERIX  - Interix
     AIX      - AIX
     HURD     - GNU Hurd
     QNX      - QNX [has variants]
     QNX6     - QNX RTP 6.1
     LYNX     - LynxOS
     BSD4     - Any BSD 4.4 system
     UNIX     - Any UNIX BSD/SYSV system
     ANDROID  - Android platform
     HAIKU    - Haiku
     WEBOS    - LG WebOS

   The following operating systems have variants:
     LINUX    - both QEXT_OS_LINUX and QEXT_OS_ANDROID are defined when building for Android
              - only QEXT_OS_LINUX is defined if building for other Linux systems
     MACOS    - both QEXT_OS_BSD4 and QEXT_OS_IOS are defined when building for iOS
              - both QEXT_OS_BSD4 and QEXT_OS_MACOS are defined when building for macOS
     FREEBSD  - QEXT_OS_FREEBSD is defined only when building for FreeBSD with a BSD userland
              - QEXT_OS_FREEBSD_KERNEL is always defined on FreeBSD, even if the userland is from GNU
*/

#if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__))
    #include <TargetConditionals.h>
    #if defined(TARGET_OS_MAC) && TARGET_OS_MAC
        #define QEXT_OS_DARWIN
        #define QEXT_OS_BSD4
        #ifdef __LP64__
            #define QEXT_OS_DARWIN64
        #else
            #define QEXT_OS_DARWIN32
        #endif
        #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
            #define QEXT_PLATFORM_UIKIT
            #if defined(TARGET_OS_WATCH) && TARGET_OS_WATCH
                #define QEXT_OS_WATCHOS
            #elif defined(TARGET_OS_TV) && TARGET_OS_TV
                #define QEXT_OS_TVOS
            #else
                #// TARGET_OS_IOS is only available in newer SDKs,
                #// so assume any other iOS-based platform is iOS for now
                #define QEXT_OS_IOS
            #endif
        #else
            #// TARGET_OS_OSX is only available in newer SDKs,
            #// so assume any non iOS-based platform is macOS for now
            #define QEXT_OS_MACOS
        #endif
    #else
        #       error "QExt has not been ported to this Apple platform"
    #endif
#elif defined(__WEBOS__)
    #define QEXT_OS_WEBOS
    #define QEXT_OS_LINUX
#elif defined(__ANDROID__) || defined(ANDROID)
    #define QEXT_OS_ANDROID
    #define QEXT_OS_LINUX
#elif defined(__CYGWIN__)
    #define QEXT_OS_CYGWIN
#elif !defined(SAG_COM) && (!defined(WINAPI_FAMILY) || WINAPI_FAMILY==WINAPI_FAMILY_DESKTOP_APP) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))
    #define QEXT_OS_WIN32
    #define QEXT_OS_WIN64
#elif !defined(SAG_COM) && (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__))
    #define QEXT_OS_WIN32
#elif defined(__sun) || defined(sun)
    #define QEXT_OS_SOLARIS
#elif defined(hpux) || defined(__hpux)
    #define QEXT_OS_HPUX
#elif defined(__native_client__)
    #define QEXT_OS_NACL
#elif defined(__EMSCRIPTEN__)
    #define QEXT_OS_WASM
#elif defined(__linux__) || defined(__linux)
    #define QEXT_OS_LINUX
#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
    #ifndef __FreeBSD_kernel__
        #define QEXT_OS_FREEBSD
    #endif
    #define QEXT_OS_FREEBSD_KERNEL
    #define QEXT_OS_BSD4
#elif defined(__NetBSD__)
    #define QEXT_OS_NETBSD
    #define QEXT_OS_BSD4
#elif defined(__OpenBSD__)
    #define QEXT_OS_OPENBSD
    #define QEXT_OS_BSD4
#elif defined(__INTERIX)
    #define QEXT_OS_INTERIX
    #define QEXT_OS_BSD4
#elif defined(_AIX)
    #define QEXT_OS_AIX
#elif defined(__Lynx__)
    #define QEXT_OS_LYNX
#elif defined(__GNU__)
    #define QEXT_OS_HURD
#elif defined(__QNXNTO__)
    #define QEXT_OS_QNX
#elif defined(__INTEGRITY)
    #define QEXT_OS_INTEGRITY
#elif defined(__rtems__)
    #define QEXT_OS_RTEMS
#elif defined(VXWORKS) /* there is no "real" VxWorks define - this has to be set in the mkspec! */
    #define QEXT_OS_VXWORKS
#elif defined(__HAIKU__)
    #define QEXT_OS_HAIKU
#elif defined(__MACH__)
    #define QEXT_OS_MACH
#else
    #    error "QExt has not been ported to this OS"
#endif

#if defined(QEXT_OS_WIN32) || defined(QEXT_OS_WIN64)
    #define QEXT_OS_WINDOWS
    #define QEXT_OS_WIN
    // On Windows, pointers to dllimport'ed variables are not constant expressions,
    // so to keep to certain initializations (like QMetaObject) constexpr, we need
    // to use functions instead.
    #define QEXT_NO_DATA_RELOCATION
#endif

#if defined(QEXT_OS_WIN)
    #undef QEXT_OS_UNIX
#elif !defined(QEXT_OS_UNIX)
    #define QEXT_OS_UNIX
#endif

// Compatibility synonyms
#ifdef QEXT_OS_DARWIN
    #define QEXT_OS_MAC
#endif
#ifdef QEXT_OS_DARWIN32
    #define QEXT_OS_MAC32
#endif
#ifdef QEXT_OS_DARWIN64
    #define QEXT_OS_MAC64
#endif
#ifdef QEXT_OS_MACOS
    #define QEXT_OS_MACX
    #define QEXT_OS_OSX
#endif

#ifdef QEXT_OS_DARWIN
    #include <Availability.h>
    #include <AvailabilityMacros.h>
    #
    #ifdef QEXT_OS_MACOS
        #if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_6
            #undef __MAC_OS_X_VERSION_MIN_REQUIRED
            #define __MAC_OS_X_VERSION_MIN_REQUIRED __MAC_10_6
        #endif
        #if !defined(MAC_OS_X_VERSION_MIN_REQUIRED) || MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6
            #undef MAC_OS_X_VERSION_MIN_REQUIRED
            #define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_6
        #endif
    #endif
    #
    #// Numerical checks are preferred to named checks, but to be safe
    #// we define the missing version names in case QExt uses them.
    #
    #if !defined(__MAC_10_11)
        #define __MAC_10_11 101100
    #endif
    #if !defined(__MAC_10_12)
        #define __MAC_10_12 101200
    #endif
    #if !defined(__MAC_10_13)
        #define __MAC_10_13 101300
    #endif
    #if !defined(__MAC_10_14)
        #define __MAC_10_14 101400
    #endif
    #if !defined(__MAC_10_15)
        #define __MAC_10_15 101500
    #endif
    #if !defined(__MAC_10_16)
        #define __MAC_10_16 101600
    #endif
    #if !defined(MAC_OS_X_VERSION_10_11)
        #define MAC_OS_X_VERSION_10_11 __MAC_10_11
    #endif
    #if !defined(MAC_OS_X_VERSION_10_12)
        #define MAC_OS_X_VERSION_10_12 __MAC_10_12
    #endif
    #if !defined(MAC_OS_X_VERSION_10_13)
        #define MAC_OS_X_VERSION_10_13 __MAC_10_13
    #endif
    #if !defined(MAC_OS_X_VERSION_10_14)
        #define MAC_OS_X_VERSION_10_14 __MAC_10_14
    #endif
    #if !defined(MAC_OS_X_VERSION_10_15)
        #define MAC_OS_X_VERSION_10_15 __MAC_10_15
    #endif
    #if !defined(MAC_OS_X_VERSION_10_16)
        #define MAC_OS_X_VERSION_10_16 __MAC_10_16
    #endif
    #
    #if !defined(__IPHONE_10_0)
        #define __IPHONE_10_0 100000
    #endif
    #if !defined(__IPHONE_10_1)
        #define __IPHONE_10_1 100100
    #endif
    #if !defined(__IPHONE_10_2)
        #define __IPHONE_10_2 100200
    #endif
    #if !defined(__IPHONE_10_3)
        #define __IPHONE_10_3 100300
    #endif
    #if !defined(__IPHONE_11_0)
        #define __IPHONE_11_0 110000
    #endif
    #if !defined(__IPHONE_12_0)
        #define __IPHONE_12_0 120000
    #endif
#endif

#ifdef __LSB_VERSION__
    #if __LSB_VERSION__ < 40
        #       error "This version of the Linux Standard Base is unsupported"
    #endif
    #ifndef QEXT_LINUXBASE
        #define QEXT_LINUXBASE
    #endif
#endif

#endif // _QEXTSYSTEM_H
